﻿using System;
using System.Globalization;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.Services;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using PAT.Data;
using PAT.Data.Bases;
using PAT.Entities;
using PAT.Services;
using PAT.Util;

public partial class aspx_tal03_CrearOT : System.Web.UI.Page
{
    #region Atributos
    private PAT.Util.Common instanciaCommon = new PAT.Util.Common();
    #endregion

    #region Propiedades

    public PatOrdenTrabajo OrdenTrabajoAsociada
    {
        get
        {
            if (this.ViewState["_OrdenTrabajoAsociada"] != null)
                return (PatOrdenTrabajo)this.ViewState["_OrdenTrabajoAsociada"];
            else
                return null;
        }
        set
        {
            this.ViewState["_OrdenTrabajoAsociada"] = value;
        }
    }

    public TList<PatOrdenTrabajoAccesorio> AccesoriosOrdenTrabajo
    {
        get
        {
            if (this.ViewState["_AccesoriosOrdenTrabajo"] != null)
                return (TList<PatOrdenTrabajoAccesorio>)this.ViewState["_AccesoriosOrdenTrabajo"];
            else
                return null;
        }
        set
        {
            this.ViewState["_AccesoriosOrdenTrabajo"] = value;
        }
    }

    public TList<PatTransferenciaDetalle> ItemsAsociadosOrdenTrabajo
    {
        get
        {
            if (this.ViewState["_ItemsAsociadosOrdenTrabajo"] != null)
                return (TList<PatTransferenciaDetalle>)this.ViewState["_ItemsAsociadosOrdenTrabajo"];
            else
                return null;
        }
        set 
        {
            this.ViewState["_ItemsAsociadosOrdenTrabajo"] = value;
        }
    }

    public TList<PatOrdenTrabajoOperacion> OperacionesAsociadasOrdenTrabajo
    {
        get
        {
            if (this.ViewState["_OperacionesAsociadasOrdenTrabajo"] != null)
                return (TList<PatOrdenTrabajoOperacion>)this.ViewState["_OperacionesAsociadasOrdenTrabajo"];
            else
                return null;
        }
        set
        {
            this.ViewState["_OperacionesAsociadasOrdenTrabajo"] = value;
        }
    }

    public TList<PatKit> KitsAsociadosOrdenTrabajo
    {
        get
        {
            if (this.ViewState["_KitsAsociadosOrdenTrabajo"] != null)
                return (TList<PatKit>)this.ViewState["_KitsAsociadosOrdenTrabajo"];
            else
                return null;
        }
        set
        {
            this.ViewState["_KitsAsociadosOrdenTrabajo"] = value;
        }
    }

    public Int32 IdNumeroDocumentoTransferencia
    {
        get
        {
            return (this.ViewState["_IdNumeroDocumentoTransferencia"] != null ? Convert.ToInt32(this.ViewState["_IdNumeroDocumentoTransferencia"]) : -1);
        }
        set
        {
            this.ViewState["_IdNumeroDocumentoTransferencia"] = value;
        }
    }

    public Decimal ValorTotalOrdenTrabajo
    {
        get
        {
            if (this.ViewState["_ValorTotalOrdenTrabajo"] != null)
                return Convert.ToDecimal(this.ViewState["_ValorTotalOrdenTrabajo"]);
            else
                return 0;
        }
        set
        {
            this.ViewState["_ValorTotalOrdenTrabajo"] = value;
        }
    }

    public DateTime ValorEstimadoEntrega 
    {
        get 
        {
            if (this.ViewState["_ValorEstimadoEntrega"] != null)
                return Convert.ToDateTime(this.ViewState["_ValorEstimadoEntrega"]);
            else
                return DateTime.Now;
        }
        set
        {
            this.ViewState["_ValorEstimadoEntrega"] = value;
        }
    }

    #endregion

    #region Eventos
    protected void Page_Load(object sender, EventArgs e)
    {
        fesPropietario.AcceptEvent += new EventHandler(fesPropietario_AcceptEvent);
        fesAseguradora.AcceptEvent += new EventHandler(fesAseguradora_AcceptEvent);
        fesGarantia.AcceptEvent += new EventHandler(fesGarantia_AcceptEvent);
        fesItems.AcceptEvent += new EventHandler(fesItems_AcceptEvent);
        fesOperaciones.AcceptEvent += new EventHandler(fesOperaciones_AcceptEvent);
        if(!IsPostBack)
        {
            UtilUI.BindListControl(ddlAlmacen, instanciaCommon.GetTallerPorEstado(true), "IdTaller", "DescripcionTaller", true);
            UtilUI.BindListControl(ddlDocumento, instanciaCommon.GetDocumentosPorEstadoYTipo(true, TiposDocumento.OrdenTrabajo), "IdDocumento", "DescripcionDocumento", true);
            UtilUI.BindListControl(ddlCargoOrden, instanciaCommon.GetCargoOrdenPorEstado(true), "IdCargoOrden", "DescripcionCargoOrden", true);
            UtilUI.BindListControl(ddlServicioOrden, instanciaCommon.GetTrabajoOrdenPorEstado(true), "IdTrabajo", "DescripcionTrabajo", true);
            UtilUI.BindListControl(ddlListaPrecios, instanciaCommon.GetListaPreciosTallerPorEstado(true), "IdListaPrecios", "DescripcionListaPrecios", true);
            UtilUI.BindListControl(ddlListaPrecioItems, instanciaCommon.GetListaPreciosItemsPorEstado(true), "IdItemListaPrecio", "Descripcion", true);
            UtilUI.BindListControl(ddlDocumentoTransferencia, instanciaCommon.GetDocumentosPorEstadoYTipo(true, TiposDocumento.Transferencia), "IdDocumento", "DescripcionDocumento", true);
            UtilUI.BindListControl(ddlModelo, instanciaCommon.GetCatalogosPorEstado(true), "IdCatalogo", "DescripcionCatalogo", true);
            UtilUI.BindListControl(ddlColor, instanciaCommon.GetColorPorEstado(true), "IdColor", "DescripcionColor", true);
            UtilUI.BindListControl(ddlNivelCombustible, instanciaCommon.GetNivelCombustiblePorEstado(true), "IdNivel", "DescripcionNIvel", true);
            UtilUI.BindListControl(ddlAccesorio, instanciaCommon.GetAccesoriosPorEstado(true), "IdAccesorio", "DescripcionAccesorio", true);
            UtilUI.BindListControl(ddlKits, instanciaCommon.GetKitActivoPorCatalogo(-1), "IdKit", "DescripcionKit", true);
            UtilUI.BindListControl(ddlCausalGarantia, instanciaCommon.GetCausalGarantiaPorEstado(true), "IdCausal", "DescripcionCausal", true);
            UtilUI.BindListControl(ddlTipoPropietario, instanciaCommon.GetTipoPropietarioPorEstado(true), "IdTipoPropietario", "DescripcionTipoPropietario", true);
            UtilUI.AddNullItemListControl(ddlRecepcionista, true);
            // Se carga la fecha y hora de recepcion en los labels adecuados
            lblFechaOrden.Text = DateTime.Now.ToString("yyyy-MM-dd", new CultureInfo("es-ES"));
            lblHoraOrden.Text = DateTime.Now.ToString("HH:mm:ss", new CultureInfo("es-ES"));
            this.ValorEstimadoEntrega = DateTime.Now;
            // Manejo de calendarios con readonly por DOM
            txtFechaCompra.Attributes.Add("readonly", "readonly");
            txtFechaVencimiento.Attributes.Add("readonly", "readonly");
            // Se inicializa los objetos de la orden 
            this.OrdenTrabajoAsociada = new PatOrdenTrabajo();
            this.AccesoriosOrdenTrabajo = new TList<PatOrdenTrabajoAccesorio>();
            this.ItemsAsociadosOrdenTrabajo = new TList<PatTransferenciaDetalle>();
            this.OperacionesAsociadasOrdenTrabajo = new TList<PatOrdenTrabajoOperacion>();
            this.KitsAsociadosOrdenTrabajo = new TList<PatKit>();
            this.AsociarGrillaAccesorios();
            this.AsociarGrillaItems();
            this.AsociarGrillaKits();
            this.AsociarGrillaOperaciones();
            this.AsociarEstimadoEntregaOrdenTrabajo();
            if (Request.QueryString["s"] == "true")
            {
                lblMessage.Text = "Orden creada satisfactoriamente!!";
            }
        }
    }

    void fesOperaciones_AcceptEvent(object sender, EventArgs e)
    {
        if (ddlDocumentoTransferencia.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoTransferencia", "alert('Se debe seleccionar un documento para transferencias')", true);
            return;
        }
        else
        {
            if (this.IdNumeroDocumentoTransferencia == -1)
                this.IdNumeroDocumentoTransferencia = instanciaCommon.GetUltimoConsecutivoPorDocumento(Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue));
        }
        if (ddlListaPrecioItems.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorListaPrecioItems", "alert('Se debe seleccionar una lista de precios para los items')", true);
            return;
        }
        if (ddlDocumento.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoOrden", "alert('Se debe seleccionar un documento para orden de trabajo')", true);
            return;
        }
        if (ddlCargoOrden.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCargoOrden", "alert('Se debe seleccionar un cargo para la orden de trabajo')", true);
            return;
        }
        if (ddlModelo.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCatalogoVehiculo", "alert('Se debe seleccionar un catalogo de vehiculo')", true);
            return;
        }
        if (ddlAlmacen.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorAlmacen", "alert('Se debe seleccionar un taller')", true);
            return;
        }
        ddlModelo.Enabled = ddlAlmacen.Enabled = ddlDocumentoTransferencia.Enabled = ddlListaPrecioItems.Enabled = ddlListaPrecios.Enabled = ddlDocumento.Enabled = ddlCargoOrden.Enabled = ddlModelo.Enabled = false;
        upnInfoGeneral.Update();
        upnInformacionVehiculo.Update();

        if (fesOperaciones.ObjectSelected != null)
        {
            PAT.Entities.PatTempario seleccionado = (PAT.Entities.PatTempario)fesOperaciones.ObjectSelected;
            hdCodigoAddOperacion.Value = seleccionado.IdOperacion.ToString();
            txtOperaciones.Text = seleccionado.DescripcionOperacion;
            Decimal tiempoEstimado = instanciaCommon.GetTiempoOperacion(Convert.ToInt16(ddlModelo.SelectedValue), seleccionado.IdOperacion, Convert.ToByte(ddlCargoOrden.SelectedValue));
            Decimal valorOperacion = 0;
            Decimal valorIva = 0;
            instanciaCommon.GetValorOperacion(seleccionado.IdOperacion, Convert.ToInt32(ddlListaPrecios.SelectedValue), Convert.ToByte(ddlCargoOrden.SelectedValue), tiempoEstimado, ref valorOperacion, ref valorIva);
            txtValorOperacion.Text = valorOperacion.ToString();
        }

        mdlBuscadorOperaciones.Hide();
    }

    void fesItems_AcceptEvent(object sender, EventArgs e)
    {
        if (ddlDocumentoTransferencia.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoTransferencia", "alert('Se debe seleccionar un documento para transferencias')", true);
            return;
        }
        else
        {
            if (this.IdNumeroDocumentoTransferencia == -1)
                this.IdNumeroDocumentoTransferencia = instanciaCommon.GetUltimoConsecutivoPorDocumento(Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue));
        }
        if (ddlListaPrecioItems.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorListaPrecioItems", "alert('Se debe seleccionar una lista de precios para los items')", true);
            return;
        }
        if (ddlDocumento.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoOrden", "alert('Se debe seleccionar un documento para orden de trabajo')", true);
            return;
        }
        if (ddlCargoOrden.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCargoOrden", "alert('Se debe seleccionar un cargo para la orden de trabajo')", true);
            return;
        }
        if (ddlModelo.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCatalogoVehiculo", "alert('Se debe seleccionar un catalogo de vehiculo')", true);
            return;
        }
        if (ddlAlmacen.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorAlmacen", "alert('Se debe seleccionar un taller')", true);
            return;
        }
        ddlModelo.Enabled = ddlAlmacen.Enabled = ddlDocumentoTransferencia.Enabled = ddlListaPrecioItems.Enabled = ddlListaPrecios.Enabled = ddlDocumento.Enabled = ddlCargoOrden.Enabled = ddlModelo.Enabled = false;
        upnInfoGeneral.Update();
        upnInformacionVehiculo.Update();
        if (fesItems.ObjectSelected != null)
        {
            PAT.Entities.PatItemInventario seleccionado = (PAT.Entities.PatItemInventario)fesItems.ObjectSelected;
            hdCodigoAddItem.Value = seleccionado.IdItemInventario.ToString();
            txtItems.Text = seleccionado.DescripcionItem;
            // Se debe buscar la cantidad de items asociados a de acuerdo al catalogo seleccionado
            Int32 cantidadItems = instanciaCommon.GetUsoXVehiculo(seleccionado.IdItemInventario, Convert.ToInt32(ddlModelo.SelectedValue));
            txtCantidadItems.Text = (cantidadItems != -1 ? cantidadItems.ToString() : String.Empty);
        }
        mdlBuscadorItems.Hide();
    }

    void fesGarantia_AcceptEvent(object sender, EventArgs e)
    {
        if (fesGarantia.ObjectSelected != null)
        {
            PAT.Entities.PatEmpresa seleccionado = (PAT.Entities.PatEmpresa)fesGarantia.ObjectSelected;
            txtNitGarantia.Text = seleccionado.NumeroIdentificacion;
            hdIdGarantia.Value = seleccionado.IdEmpresa.ToString();
        }
        mdlBuscadorGarantia.Hide();
    }

    void fesAseguradora_AcceptEvent(object sender, EventArgs e)
    {
        if (fesAseguradora.ObjectSelected != null)
        {
            PAT.Entities.PatEmpresa seleccionado = (PAT.Entities.PatEmpresa)fesAseguradora.ObjectSelected;
            txtNitAseguradora.Text = seleccionado.NumeroIdentificacion;
            hdIdAseguradora.Value = seleccionado.IdEmpresa.ToString();
        }
        mdlBuscadorAseguradora.Hide();
    }

    void fesPropietario_AcceptEvent(object sender, EventArgs e)
    {
        // Se toma el objeto seleccionado y se coloca la información dentro de los controles especificos
        if (fesPropietario.ObjectSelected != null)
        {
            PAT.Entities.PatCliente seleccionado = (PAT.Entities.PatCliente)fesPropietario.ObjectSelected;
            hdIdCliente.Value = seleccionado.IdCliente.ToString();
            txtCedula.Text = seleccionado.NumeroIdentificacion;
            lblNombres.Text = seleccionado.Nombres;
            lblApellidos.Text = seleccionado.Apellidos;
            lblDireccion.Text = seleccionado.Direccion;
            lblTelefonoFijo.Text = seleccionado.TelefonoFijo;
            lblTelefonoMovil.Text = seleccionado.TelefonoMovil;
            lblEmail.Text = seleccionado.TelefonoMovil;
        }
        mdlBuscadorCliente.Hide();
    }

    protected void ddlDocumento_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlDocumento.SelectedValue != String.Empty)
            lblNumeroOrden.Text = instanciaCommon.GetUltimoConsecutivoPorDocumento(Convert.ToInt32(ddlDocumento.SelectedValue)).ToString();
        else
            lblNumeroOrden.Text = String.Empty;
    }

    protected void ddlAlmacen_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlAlmacen.SelectedValue != String.Empty)
        {
            UtilUI.BindListControl(ddlRecepcionista, instanciaCommon.GetEmpleadosPorTaller(Convert.ToInt32(ddlAlmacen.SelectedValue), TipoEmpleado.RecepcionistaTaller), "IdEmpleado", "Apellidos", true);
        }
        else
        {
            ddlRecepcionista.Items.Clear();
            UtilUI.AddNullItemListControl(ddlRecepcionista, true);
        } 
    }

    protected void ddlListaPrecios_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlModelo.SelectedValue != String.Empty && ddlListaPrecios.SelectedValue != String.Empty)
        {
            UtilUI.BindListControl(ddlKits, instanciaCommon.GetKitActivoPorCatalogoPorListaPrecio(Convert.ToInt32(ddlModelo.SelectedValue), Convert.ToInt32(ddlListaPrecios.SelectedValue)), "IdKit", "DescripcionKit", true);
            upnInfoItemsOperaciones.Update();
        }
    }

    protected void ddlModelo_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlModelo.SelectedValue != String.Empty)
        {
            String rootVINBasico = instanciaCommon.GetVINBasicoPorCatalogo(Convert.ToInt32(ddlModelo.SelectedValue));
            txtIdentificacionVehiculo.ReadOnly = false;
            txtIdentificacionVehiculo.Text = rootVINBasico;
            regTxtIdentificacionVehiculo.ValidationExpression = "(" + rootVINBasico + ")[\\w]*";
            regTxtIdentificacionVehiculo.Enabled = true;
        }
        else
        {
            regTxtIdentificacionVehiculo.ValidationExpression = txtIdentificacionVehiculo.Text = String.Empty;
            regTxtIdentificacionVehiculo.Enabled = false;
            txtIdentificacionVehiculo.ReadOnly = true;
        }
        if (ddlModelo.SelectedValue != String.Empty && ddlListaPrecios.SelectedValue != String.Empty)
        {
            UtilUI.BindListControl(ddlKits, instanciaCommon.GetKitActivoPorCatalogoPorListaPrecio(Convert.ToInt32(ddlModelo.SelectedValue), Convert.ToInt32(ddlListaPrecios.SelectedValue)), "IdKit", "DescripcionKit", true);
            upnInfoItemsOperaciones.Update();
        }
    }

    protected void ddlCargoOrden_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddlCargoOrden.SelectedValue == String.Empty || ddlCargoOrden.SelectedValue == "1" || ddlCargoOrden.SelectedValue == "4")
            txtNitAseguradora.Enabled = imgSearchNitAseguradora.Enabled = txtSiniestro.Enabled = txtPorcentajeDeducible.Enabled = txtMinimoDeducible.Enabled = txtNumeroAutorizacion.Enabled = txtNitGarantia.Enabled = imgSearchNitGarantia.Enabled = txtNumeroAutorizacionGarantia.Enabled = ddlCausalGarantia.Enabled = rqDdlCausalGarantia.Enabled = rqTxtNitAseguradora.Enabled = rqTxtSiniestro.Enabled = rqTxtPorcentajeDeducible.Enabled = rqTxtMinimoDeducible.Enabled = rqTxtNumeroAutorizacion.Enabled = rqTxtNitGarantia.Enabled = rqTxtNumeroAutorizacionGarantia.Enabled = false;
        else if (ddlCargoOrden.SelectedValue == "2")
        {
            txtNitAseguradora.Enabled = imgSearchNitAseguradora.Enabled = txtSiniestro.Enabled = txtPorcentajeDeducible.Enabled = txtMinimoDeducible.Enabled = txtNumeroAutorizacion.Enabled = rqTxtNitAseguradora.Enabled = rqTxtSiniestro.Enabled = rqTxtPorcentajeDeducible.Enabled = rqTxtMinimoDeducible.Enabled = rqTxtNumeroAutorizacion.Enabled = true;
            txtNitGarantia.Enabled = imgSearchNitGarantia.Enabled = txtNumeroAutorizacionGarantia.Enabled = ddlCausalGarantia.Enabled = rqDdlCausalGarantia.Enabled = rqTxtNitGarantia.Enabled = rqTxtNumeroAutorizacionGarantia.Enabled = false;
        }
        else if (ddlCargoOrden.SelectedValue == "3")
        {
            txtNitAseguradora.Enabled = imgSearchNitAseguradora.Enabled = txtSiniestro.Enabled = txtPorcentajeDeducible.Enabled = txtMinimoDeducible.Enabled = txtNumeroAutorizacion.Enabled = rqTxtNitAseguradora.Enabled = rqTxtSiniestro.Enabled = rqTxtPorcentajeDeducible.Enabled = rqTxtMinimoDeducible.Enabled = rqTxtNumeroAutorizacion.Enabled = false;
            txtNitGarantia.Enabled = imgSearchNitGarantia.Enabled = txtNumeroAutorizacionGarantia.Enabled = ddlCausalGarantia.Enabled = rqDdlCausalGarantia.Enabled = rqTxtNitGarantia.Enabled = rqTxtNumeroAutorizacionGarantia.Enabled = true;
        }
        upnInfoItemsOperaciones.Update();        
        upnInformacionVehiculo.Update();
    }

    protected void btnPlaca_Click(object sender, EventArgs e)
    {
        // Se realiza la busqueda del vehiculo con la placa que se acaba de ingresar
        PatVehiculo vehiculo = instanciaCommon.GetVehiculoPorPlaca(txtNumeroPlaca.Text);
        if (vehiculo != null)
        {
            PatCliente clienteVehiculo = instanciaCommon.GetClientePorId(vehiculo.IdCliente);
            txtCedula.Text = clienteVehiculo.NumeroIdentificacion;
            hdIdCliente.Value = clienteVehiculo.IdCliente.ToString();
            lblNombres.Text = clienteVehiculo.Nombres;
            lblApellidos.Text = clienteVehiculo.Apellidos;
            lblDireccion.Text = clienteVehiculo.Direccion;
            lblTelefonoFijo.Text = clienteVehiculo.TelefonoFijo;
            lblTelefonoMovil.Text = clienteVehiculo.TelefonoMovil;
            lblEmail.Text = clienteVehiculo.EMail;
            pnlInfoPropietario.Update();
            // Ahora se carga la informacion relacionada al vehiculo
            hdIdVehiculo.Value = vehiculo.IdVehiculo.ToString();
            ddlModelo.SelectedValue = vehiculo.IdCatalogo.ToString();
            txtIdentificacionVehiculo.Text = vehiculo.Vin;
            txtNumeroMotor.Text = vehiculo.Motor;
            txtNumeroSerie.Text = vehiculo.Serie;
            txtNumeroChasis.Text = vehiculo.Chasis;
            txtAnoModelo.Text = vehiculo.AnioModelo.ToString();
            txtKilometrajeCompra.Text = vehiculo.KilometrajeVenta.ToString();
            ddlColor.SelectedValue = vehiculo.IdColor.ToString();
            txtFechaCompra.Text = vehiculo.FechaVenta.ToString("dd/MM/yyyy");
            txtCodigoRadio.Text = vehiculo.NumeroRadio.ToString();
            txtConsecionarioVendedor.Text = vehiculo.NombreConcesionarioVendedor;
            upnInformacionVehiculo.Update();
        }
    }

    protected void btnAgregarAccesorio_Click(object sender, EventArgs e)
    {
        if (ddlAccesorio.SelectedValue != String.Empty)
        {
            if (AccesoriosOrdenTrabajo.Find(delegate(PatOrdenTrabajoAccesorio objeto) { return objeto.IdAccesorio == Convert.ToInt32(ddlAccesorio.SelectedValue); }) == null)
            {
                PatOrdenTrabajoAccesorio instanciaAccesorio = new PatOrdenTrabajoAccesorio();
                instanciaAccesorio.IdAccesorio = Convert.ToInt32(ddlAccesorio.SelectedValue);
                instanciaAccesorio.IdAccesorioSource = DataRepository.PatAccesorioProvider.GetByIdAccesorio(instanciaAccesorio.IdAccesorio);
                instanciaAccesorio.CantidadAccesorio = Convert.ToInt16(txtCantidadAccesorio.Text);
                instanciaAccesorio.EstadoAccesorio = txtDetalleAccesorio.Text;
                instanciaAccesorio.Activo = true;
                this.AccesoriosOrdenTrabajo.Add(instanciaAccesorio);
                this.AsociarGrillaAccesorios();
                ddlAccesorio.SelectedIndex = 0;
                txtCantidadAccesorio.Text = txtDetalleAccesorio.Text = String.Empty;
            }
            else
                ScriptManager.RegisterStartupScript(pnlInfoAdicional, this.GetType(), "errorAccesorio", "alert('Este accesorio ya ha sido agregado')", true);
        }
    }

    protected void grdAccesorios_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            foreach (DataControlFieldCell cell in e.Row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    LinkButton button = control as LinkButton;
                    if (button != null && button.CommandName == "Delete")
                        button.OnClientClick = "return confirm('Are you sure you want to delete the record');";
                }
            }
        }
    }

    protected void grdItems_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            foreach (DataControlFieldCell cell in e.Row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    LinkButton button = control as LinkButton;
                    if (button != null && button.CommandName == "Delete")
                        button.OnClientClick = "return confirm('Are you sure you want to delete the record');";
                }
            }
        }
    }

    protected void grdOperaciones_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            foreach (DataControlFieldCell cell in e.Row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    LinkButton button = control as LinkButton;
                    if (button != null && button.CommandName == "Delete")
                        button.OnClientClick = "return confirm('Are you sure you want to delete the record');";
                }
            }
        }
    }

    protected void grdAccesorios_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        this.AccesoriosOrdenTrabajo.Remove(this.AccesoriosOrdenTrabajo[e.RowIndex]);
        this.AsociarGrillaAccesorios();
    }

    protected void btnAgregarKit_Click(object sender, EventArgs e)
    { 
        if(ddlKits.SelectedValue != String.Empty)
        {
            // Se valida que se halla seleccionado un documento para realizar la transferencia
            if (ddlDocumentoTransferencia.SelectedValue == String.Empty)
            {
                ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoTransferencia", "alert('Se debe seleccionar un documento para transferencias')", true);
                return;
            }
            else
            {
                if (this.IdNumeroDocumentoTransferencia == -1)
                    this.IdNumeroDocumentoTransferencia = instanciaCommon.GetUltimoConsecutivoPorDocumento(Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue));
            }
            if (ddlListaPrecioItems.SelectedValue == String.Empty)
            {
                ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorListaPrecioItems", "alert('Se debe seleccionar una lista de precios para los items')", true);
                return;
            }
            if (ddlDocumento.SelectedValue == String.Empty)
            {
                ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoOrden", "alert('Se debe seleccionar un documento para orden de trabajo')", true);
                return;
            }
            if (ddlCargoOrden.SelectedValue == String.Empty)
            {
                ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCargoOrden", "alert('Se debe seleccionar un cargo para la orden de trabajo')", true);
                return;
            }
            if (ddlModelo.SelectedValue == String.Empty)
            {
                ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCatalogoVehiculo", "alert('Se debe seleccionar un catalogo de vehiculo')", true);
                return;
            }
            if (ddlAlmacen.SelectedValue == String.Empty)
            {
                ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorAlmacen", "alert('Se debe seleccionar un taller')", true);
                return;
            }
            ddlModelo.Enabled = ddlAlmacen.Enabled = ddlDocumentoTransferencia.Enabled = ddlListaPrecioItems.Enabled = ddlListaPrecios.Enabled = ddlDocumento.Enabled = ddlCargoOrden.Enabled = ddlModelo.Enabled = false;
            upnInfoGeneral.Update();
            upnInformacionVehiculo.Update();
            // Se consulta mediante un deepload el kit seleccionado para agregar
            PatKit instanciaKit = instanciaCommon.GetKitPorId(Convert.ToInt32(ddlKits.SelectedValue), true);
            #region Manejo Kit
            if(KitsAsociadosOrdenTrabajo.Find(delegate(PatKit objeto){return objeto.IdKit == instanciaKit.IdKit;}) == null)
            {
                KitsAsociadosOrdenTrabajo.Add(instanciaKit);
                AsociarGrillaKits();
                #region Manejo Items
                // Se agregan al arreglo ItemsAsociadosOrdenTrabajo los valores que se encontraron asociados al kit
                foreach (PatKitItem item in instanciaKit.PatKitItemCollection)
                {
                    Int32 cantidadItems = instanciaCommon.GetUsoXVehiculo(item.IdItemInventario, Convert.ToInt32(ddlModelo.SelectedValue));
                    Decimal precioItem = instanciaCommon.GetPrecioItemXListaPrecios(item.IdItemInventario, Convert.ToByte(ddlListaPrecioItems.SelectedValue));
                    if (cantidadItems != -1 && precioItem != -1 && this.ItemsAsociadosOrdenTrabajo.Find(delegate(PatTransferenciaDetalle objeto) { return objeto.IdItemInventario == item.IdItemInventario; }) == null)
                    {
                        PatTransferenciaDetalle itemDetalle = new PatTransferenciaDetalle();
                        itemDetalle.IdDocumento = Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue);
                        itemDetalle.NumeroTransferencia = this.IdNumeroDocumentoTransferencia;
                        itemDetalle.IdItemInventario = item.IdItemInventario;
                        itemDetalle.IdItemInventarioSource = instanciaCommon.GetItemCatalogoPorId(item.IdItemInventario);
                        Decimal porcentajeIvaItem = itemDetalle.IdItemInventarioSource.PorcentajeIva;
                        itemDetalle.Cantidad = cantidadItems;
                        itemDetalle.Iva = (((Decimal)cantidadItems) * precioItem) * (porcentajeIvaItem / 100);
                        itemDetalle.PrecioTotal = (((Decimal)cantidadItems) * precioItem) + itemDetalle.Iva;
                        ValorTotalOrdenTrabajo += itemDetalle.PrecioTotal;
                        this.ItemsAsociadosOrdenTrabajo.Add(itemDetalle);
                    }
                }
                this.AsociarGrillaItems();
                #endregion

                #region Manejo Operaciones
                foreach (PatKitOperacion item in instanciaKit.PatKitOperacionCollection)
                {
                    if (this.OperacionesAsociadasOrdenTrabajo.Find(delegate(PatOrdenTrabajoOperacion objeto) { return objeto.IdOperacion == item.IdOperacion; }) == null)
                    {
                        Decimal valorOperacion = 0;
                        Decimal valorIva = 0;
                        PatOrdenTrabajoOperacion itemOperacion = new PatOrdenTrabajoOperacion();
                        itemOperacion.IdDocumento = Convert.ToInt32(ddlDocumento.SelectedValue);
                        itemOperacion.NumeroOrden = Convert.ToInt32(lblNumeroOrden.Text);
                        itemOperacion.IdOperacion = item.IdOperacion;
                        itemOperacion.IdOperacionSource = instanciaCommon.GetOperacionPorId(item.IdOperacion);
                        itemOperacion.TiempoLiquidado = itemOperacion.TiempoOriginalOperacion = instanciaCommon.GetTiempoOperacion(Convert.ToInt16(ddlModelo.SelectedValue), item.IdOperacion, Convert.ToByte(ddlCargoOrden.SelectedValue));

                        PatEmpleado mecanico = instanciaCommon.GetEmpleadoMenorCargaTrabajo(itemOperacion.IdOperacionSource.IdTipoOperacion, Convert.ToInt32(ddlAlmacen.SelectedValue));
                        if (mecanico != null)
                        {
                            itemOperacion.IdEmpleado = mecanico.IdEmpleado;
                            itemOperacion.IdEmpleadoSource = mecanico;
                            itemOperacion.IdEstadoOperacion = 1;
                            itemOperacion.IdEstadoOperacionSource = instanciaCommon.GetEstadoOperacionPorId(1);
                            this.ValorEstimadoEntrega = instanciaCommon.GetEstimadoEntregaOT(this.ValorEstimadoEntrega, Convert.ToInt32(ddlAlmacen.SelectedValue), itemOperacion.TiempoLiquidado.Value);
                        }
                        else
                        {
                            itemOperacion.IdEmpleadoSource = null;
                            itemOperacion.IdEstadoOperacion = 5;
                            itemOperacion.IdEstadoOperacionSource = instanciaCommon.GetEstadoOperacionPorId(5);
                        }

                        itemOperacion.IdCargoOperacion = Convert.ToByte(ddlCargoOrden.SelectedValue);
                        itemOperacion.IdCargoOperacionSource = instanciaCommon.GetCargoOrdenPorId(Convert.ToByte(ddlCargoOrden.SelectedValue));
                        instanciaCommon.GetValorOperacion(item.IdOperacion, Convert.ToInt32(ddlListaPrecios.SelectedValue), Convert.ToByte(ddlCargoOrden.SelectedValue), itemOperacion.TiempoLiquidado.Value, ref valorOperacion, ref valorIva);
                        itemOperacion.ValorOperacion = valorOperacion;
                        itemOperacion.Activo = true;
                        ValorTotalOrdenTrabajo += valorOperacion;
                        this.OperacionesAsociadasOrdenTrabajo.Add(itemOperacion);
                    }
                }
                this.AsociarGrillaOperaciones();
                #endregion
                this.AsociarConsolidadOrdenTrabajo();
                this.AsociarEstimadoEntregaOrdenTrabajo();
            }
            #endregion
        }
    }

    protected void btnAgregarItem_Click(object sender, EventArgs e)
    {
        // Se valida que se halla seleccionado un documento para realizar la transferencia
        if (ddlDocumentoTransferencia.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoTransferencia", "alert('Se debe seleccionar un documento para transferencias')", true);
            return;
        }
        else
        {
            if (this.IdNumeroDocumentoTransferencia == -1)
                this.IdNumeroDocumentoTransferencia = instanciaCommon.GetUltimoConsecutivoPorDocumento(Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue));
        }
        if (ddlListaPrecioItems.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorListaPrecioItems", "alert('Se debe seleccionar una lista de precios para los items')", true);
            return;
        }
        if (ddlDocumento.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoOrden", "alert('Se debe seleccionar un documento para orden de trabajo')", true);
            return;
        }
        if (ddlCargoOrden.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCargoOrden", "alert('Se debe seleccionar un cargo para la orden de trabajo')", true);
            return;
        }
        if (ddlModelo.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCatalogoVehiculo", "alert('Se debe seleccionar un catalogo de vehiculo')", true);
            return;
        }
        if (ddlAlmacen.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorAlmacen", "alert('Se debe seleccionar un taller')", true);
            return;
        }
        ddlModelo.Enabled = ddlAlmacen.Enabled = ddlDocumentoTransferencia.Enabled = ddlListaPrecioItems.Enabled = ddlListaPrecios.Enabled = ddlDocumento.Enabled = ddlCargoOrden.Enabled = ddlModelo.Enabled = false;
        upnInfoGeneral.Update();
        upnInformacionVehiculo.Update();
        // Se crea un objeto PatItemInventario con el id que se encuentra en el hidden
        PatItemInventario item = instanciaCommon.GetItemCatalogoPorId(Convert.ToInt32(hdCodigoAddItem.Value));
        Int32 cantidadItems = Convert.ToInt32(txtCantidadItems.Text);
        Decimal precioItem = instanciaCommon.GetPrecioItemXListaPrecios(item.IdItemInventario, Convert.ToByte(ddlListaPrecioItems.SelectedValue));
        if (cantidadItems > 0 && precioItem != -1 && this.ItemsAsociadosOrdenTrabajo.Find(delegate(PatTransferenciaDetalle objeto) { return objeto.IdItemInventario == item.IdItemInventario; }) == null)
        {
            PatTransferenciaDetalle itemDetalle = new PatTransferenciaDetalle();
            itemDetalle.IdDocumento = Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue);
            itemDetalle.NumeroTransferencia = this.IdNumeroDocumentoTransferencia;
            itemDetalle.IdItemInventario = item.IdItemInventario;
            itemDetalle.IdItemInventarioSource = instanciaCommon.GetItemCatalogoPorId(item.IdItemInventario);
            Decimal porcentajeIvaItem = itemDetalle.IdItemInventarioSource.PorcentajeIva;
            itemDetalle.Cantidad = cantidadItems;
            itemDetalle.Iva = (((Decimal)cantidadItems) * precioItem) * (porcentajeIvaItem / 100);
            itemDetalle.PrecioTotal = (((Decimal)cantidadItems) * precioItem) + itemDetalle.Iva;
            ValorTotalOrdenTrabajo += itemDetalle.PrecioTotal;
            this.ItemsAsociadosOrdenTrabajo.Add(itemDetalle);
        }
        txtItems.Text = hdCodigoAddItem.Value = txtCantidadItems.Text = String.Empty;
        this.AsociarGrillaItems();
        this.AsociarConsolidadOrdenTrabajo();
    }

    protected void btnAgregarOperacion_Click(object sender, EventArgs e)
    {
        // Se valida que se halla seleccionado un documento para realizar la transferencia
        if (ddlDocumentoTransferencia.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoTransferencia", "alert('Se debe seleccionar un documento para transferencias')", true);
            return;
        }
        else
        {
            if (this.IdNumeroDocumentoTransferencia == -1)
                this.IdNumeroDocumentoTransferencia = instanciaCommon.GetUltimoConsecutivoPorDocumento(Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue));
        }
        if (ddlListaPrecioItems.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorListaPrecioItems", "alert('Se debe seleccionar una lista de precios para los items')", true);
            return;
        }
        if (ddlDocumento.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorDocumentoOrden", "alert('Se debe seleccionar un documento para orden de trabajo')", true);
            return;
        }
        if (ddlCargoOrden.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCargoOrden", "alert('Se debe seleccionar un cargo para la orden de trabajo')", true);
            return;
        }
        if (ddlModelo.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorCatalogoVehiculo", "alert('Se debe seleccionar un catalogo de vehiculo')", true);
            return;
        }
        if (ddlAlmacen.SelectedValue == String.Empty)
        {
            ScriptManager.RegisterStartupScript(upnInfoItemsOperaciones, this.GetType(), "errorAlmacen", "alert('Se debe seleccionar un taller')", true);
            return;
        }
        ddlModelo.Enabled = ddlAlmacen.Enabled = ddlDocumentoTransferencia.Enabled = ddlListaPrecioItems.Enabled = ddlListaPrecios.Enabled = ddlDocumento.Enabled = ddlCargoOrden.Enabled = ddlModelo.Enabled = false;
        upnInfoGeneral.Update();
        upnInformacionVehiculo.Update();
        // Se crea un objeto PatItemInventario con el id que se encuentra en el hidden
        PatTempario item = instanciaCommon.GetOperacionPorId(Convert.ToInt32(hdCodigoAddOperacion.Value));
        if (this.OperacionesAsociadasOrdenTrabajo.Find(delegate(PatOrdenTrabajoOperacion objeto) { return objeto.IdOperacion == item.IdOperacion; }) == null)
        {
            PatOrdenTrabajoOperacion itemOperacion = new PatOrdenTrabajoOperacion();
            itemOperacion.IdDocumento = Convert.ToInt32(ddlDocumento.SelectedValue);
            itemOperacion.NumeroOrden = Convert.ToInt32(lblNumeroOrden.Text);
            itemOperacion.IdOperacion = item.IdOperacion;
            itemOperacion.IdOperacionSource = instanciaCommon.GetOperacionPorId(item.IdOperacion);
            itemOperacion.IdCargoOperacion = Convert.ToByte(ddlCargoOrden.SelectedValue);
            itemOperacion.IdCargoOperacionSource = instanciaCommon.GetCargoOrdenPorId(Convert.ToByte(ddlCargoOrden.SelectedValue));
            itemOperacion.TiempoLiquidado = itemOperacion.TiempoOriginalOperacion = instanciaCommon.GetTiempoOperacion(Convert.ToInt16(ddlModelo.SelectedValue), item.IdOperacion, Convert.ToByte(ddlCargoOrden.SelectedValue));

            PatEmpleado mecanico = instanciaCommon.GetEmpleadoMenorCargaTrabajo(itemOperacion.IdOperacionSource.IdTipoOperacion, Convert.ToInt32(ddlAlmacen.SelectedValue));
            if (mecanico != null)
            {
                itemOperacion.IdEmpleado = mecanico.IdEmpleado;
                itemOperacion.IdEmpleadoSource = mecanico;
                itemOperacion.IdEstadoOperacion = 1;
                itemOperacion.IdEstadoOperacionSource = instanciaCommon.GetEstadoOperacionPorId(1);
                this.ValorEstimadoEntrega = instanciaCommon.GetEstimadoEntregaOT(this.ValorEstimadoEntrega, Convert.ToInt32(ddlAlmacen.SelectedValue), itemOperacion.TiempoLiquidado.Value);
            }
            else
            {
                itemOperacion.IdEmpleadoSource = null;
                itemOperacion.IdEstadoOperacion = 5;
                itemOperacion.IdEstadoOperacionSource = instanciaCommon.GetEstadoOperacionPorId(5);
            }

            if (ddlCausalGarantia.SelectedValue != String.Empty)
                itemOperacion.IdCausalGarantia1 = Convert.ToInt16(ddlCausalGarantia.SelectedValue);
            itemOperacion.ValorOperacion = Convert.ToDecimal(txtValorOperacion.Text);
            itemOperacion.Activo = true;
            ValorTotalOrdenTrabajo += itemOperacion.ValorOperacion;
            this.OperacionesAsociadasOrdenTrabajo.Add(itemOperacion);
        }
        txtOperaciones.Text = hdCodigoAddOperacion.Value = txtValorOperacion.Text = String.Empty;
        ddlCausalGarantia.SelectedIndex = 0;
        this.AsociarGrillaOperaciones();
        this.AsociarConsolidadOrdenTrabajo();
        this.AsociarEstimadoEntregaOrdenTrabajo();
    }

    protected void grdItems_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            PatTransferenciaDetalle instancia = ItemsAsociadosOrdenTrabajo[Convert.ToInt32(e.CommandArgument)];
            // Se quita el valor de este item del total estimado de la orden de trabajo
            ValorTotalOrdenTrabajo -= instancia.PrecioTotal;
            // Se debe remover de la lista ItemsAsociadosOrdenTrabajo el indice que llega como parametro
            ItemsAsociadosOrdenTrabajo.Remove(instancia);
            this.AsociarGrillaItems();
            this.AsociarConsolidadOrdenTrabajo();
        }
    }

    protected void grdItems_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

    }

    protected void grdOperaciones_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            PatOrdenTrabajoOperacion instancia = OperacionesAsociadasOrdenTrabajo[Convert.ToInt32(e.CommandArgument)];
            // Se quita el valor de esta operacion del total estimado de la orden de trabajo
            ValorTotalOrdenTrabajo -= instancia.ValorOperacion;
            this.ValorEstimadoEntrega = instanciaCommon.GetEstimadoEntregaOT(this.ValorEstimadoEntrega, Convert.ToInt32(ddlAlmacen.SelectedValue), instancia.TiempoLiquidado.Value * -1);
            // Se debe remover de la lista ItemsAsociadosOrdenTrabajo el indice que llega como parametro
            OperacionesAsociadasOrdenTrabajo.Remove(instancia);
            this.AsociarGrillaOperaciones();
            this.AsociarConsolidadOrdenTrabajo();
            this.AsociarEstimadoEntregaOrdenTrabajo();
        }
    }

    protected void grdOperaciones_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

    }

    protected void imgSaveOrder_Click(object sender, ImageClickEventArgs e)
    {
        try
        {
            // Se revisa si es un vehiculo existente
            PatVehiculo instanciaVehiculo = new PatVehiculo();
            if (hdIdVehiculo.Value != String.Empty)
                instanciaVehiculo = DataRepository.PatVehiculoProvider.GetByIdVehiculo(Convert.ToInt32(hdIdVehiculo.Value));
            else
                instanciaVehiculo.IdVehiculo = -1;
            // Se agregan los nuevos valores
            instanciaVehiculo.Vin = txtIdentificacionVehiculo.Text;
            instanciaVehiculo.Placa = txtNumeroPlaca.Text;
            instanciaVehiculo.Motor = txtNumeroMotor.Text;
            instanciaVehiculo.IdCliente = Convert.ToInt32(hdIdCliente.Value);
            instanciaVehiculo.IdClienteSource = null;
            instanciaVehiculo.IdColorSource = null;
            instanciaVehiculo.IdTipoServicioSource = null;
            instanciaVehiculo.IdCatalogoSource = null;
            instanciaVehiculo.PatOrdenTrabajoCollection = null;
            instanciaVehiculo.Serie = txtNumeroSerie.Text;
            instanciaVehiculo.Chasis = txtNumeroChasis.Text;
            instanciaVehiculo.IdColor = Convert.ToInt32(ddlColor.SelectedValue);
            instanciaVehiculo.AnioModelo = Convert.ToInt16(txtAnoModelo.Text);
            instanciaVehiculo.IdTipoServicio = 1; //Privado
            instanciaVehiculo.FechaVencimientoSeguroObligatorio = Convert.ToDateTime(txtFechaVencimiento.Text);
            instanciaVehiculo.NombreConcesionarioVendedor = txtConsecionarioVendedor.Text;
            instanciaVehiculo.FechaVenta = Convert.ToDateTime(txtFechaCompra.Text);
            instanciaVehiculo.KilometrajeVenta = Convert.ToInt32(txtKilometrajeCompra.Text);
            instanciaVehiculo.NumeroRadio = Convert.ToInt32(txtCodigoRadio.Text);
            instanciaVehiculo.UltimoKilometraje = Convert.ToInt32(txtKilometraje.Text);
            instanciaVehiculo.KilometrajePromedio = Convert.ToInt32(txtKilometraje.Text);
            instanciaVehiculo.Activo = true;
            instanciaVehiculo.IdCatalogo = Convert.ToInt32(ddlModelo.SelectedValue);
            // Se arma un objeto tipo PatOrdenTrabajo con la info general del 
            PatOrdenTrabajo instanciaOrdenTrabajo = new PatOrdenTrabajo();
            instanciaOrdenTrabajo.IdDocumento = Convert.ToInt32(ddlDocumento.SelectedValue);
            instanciaOrdenTrabajo.NumeroOrden = Convert.ToInt32(lblNumeroOrden.Text);
            if (hdIdVehiculo.Value != String.Empty)
                instanciaOrdenTrabajo.IdVehiculo = Convert.ToInt32(hdIdVehiculo.Value);
            instanciaOrdenTrabajo.IdCliente = Convert.ToInt32(hdIdCliente.Value);
            instanciaOrdenTrabajo.IdTipoPropietario = Convert.ToInt16(ddlTipoPropietario.SelectedValue);
            instanciaOrdenTrabajo.IdEstadoOrden = 1; //Estado Abierta
            instanciaOrdenTrabajo.IdCargoOrden = Convert.ToByte(ddlCargoOrden.SelectedValue);
            instanciaOrdenTrabajo.IdTrabajo = Convert.ToByte(ddlServicioOrden.SelectedValue);
            instanciaOrdenTrabajo.FechaEntrada = Convert.ToDateTime(lblFechaOrden.Text);
            instanciaOrdenTrabajo.HoraEntrada = Convert.ToDateTime(lblFechaOrden.Text + " " + lblHoraOrden.Text);
            instanciaOrdenTrabajo.FechaCreacion = DateTime.Now;
            instanciaOrdenTrabajo.FechaEstimadaEntrega = Convert.ToDateTime(txtFechaEstimadaEntrega.Text);
            instanciaOrdenTrabajo.HoraEstimadaEntrega = Convert.ToDateTime(txtFechaEstimadaEntrega.Text + " " + txtHoraEstimadaEntrega.Text);
            instanciaOrdenTrabajo.NumeroEntrada = Convert.ToInt32(txtNumeroEntrada.Text);
            instanciaOrdenTrabajo.KilometrajeEntrada = Convert.ToInt32(txtKilometraje.Text);
            instanciaOrdenTrabajo.IdRecepcionista = Convert.ToInt32(ddlRecepcionista.SelectedValue);
            instanciaOrdenTrabajo.IdTaller = Convert.ToInt32(ddlAlmacen.SelectedValue);
            instanciaOrdenTrabajo.NumeroLocker = Convert.ToInt32(txtNumeroLocker.Text);
            instanciaOrdenTrabajo.ObservacionesCliente = txtObservacionesCliente.Text;
            instanciaOrdenTrabajo.ObservacionesRecepcionista = txtObservacionesRecepcionista.Text;
            instanciaOrdenTrabajo.IdListaPrecios = Convert.ToInt32(ddlListaPrecios.SelectedValue);
            instanciaOrdenTrabajo.IdNivelCombustible = Convert.ToByte(ddlNivelCombustible.SelectedValue);
            instanciaOrdenTrabajo.IdEstadoCita = 2; // Estado cumplido
            instanciaOrdenTrabajo.AceptaEncuesta = Convert.ToBoolean(ddlAceptoEncuesta.SelectedValue);
            instanciaOrdenTrabajo.VehiculoInspeccionadoElevador = Convert.ToBoolean(ddlRevisadoElevador.SelectedValue);
            instanciaOrdenTrabajo.EntregaPresupuesto = Convert.ToBoolean(ddlPresupuesto.SelectedValue);
            instanciaOrdenTrabajo.IdEstadoLiquidacion = 1; // No liquidada
            instanciaOrdenTrabajo.EsCotizacion = false;
            instanciaOrdenTrabajo.Activo = true;
            // Se genera un objeto tipo  PatOrdeTrabajoSeguros y PatOrdenTrabajoGarantia
            PatOrdenTrabajoSeguros instanciaOrdenTrabajoSeguros = new PatOrdenTrabajoSeguros();
            PatOrdenTrabajoGarantia instanciaOrdenTrabajoGarantia = new PatOrdenTrabajoGarantia();
            if (ddlCargoOrden.SelectedValue == "2") // Seguros
            {
                instanciaOrdenTrabajoSeguros.NitAseguradora = txtNitAseguradora.Text;
                instanciaOrdenTrabajoSeguros.PorcentajeDeducible = Convert.ToDecimal(txtPorcentajeDeducible.Text);
                instanciaOrdenTrabajoSeguros.DeducibleMinimo = Convert.ToDecimal(txtMinimoDeducible.Text);
                instanciaOrdenTrabajoSeguros.DeducibleMinimoRepuestos = 0;
                instanciaOrdenTrabajoSeguros.NumeroSiniestro = txtSiniestro.Text;
                instanciaOrdenTrabajoSeguros.NumeroAutorizacion = txtNumeroAutorizacion.Text;
                instanciaOrdenTrabajoSeguros.Activo = true;
            }
            else
                instanciaOrdenTrabajoSeguros = null;
            if (ddlCargoOrden.SelectedValue == "3") // Garantia
            {
                instanciaOrdenTrabajoGarantia.NitFabrica = txtNitGarantia.Text;
                instanciaOrdenTrabajoGarantia.NumeroAutorizacion = txtNumeroAutorizacionGarantia.Text;
                instanciaOrdenTrabajoGarantia.Activo = true;
            }
            else
                instanciaOrdenTrabajoGarantia = null;
            instanciaCommon.GuardarOrdenTrabajoCompleta(instanciaVehiculo, instanciaOrdenTrabajo,
                                                        AccesoriosOrdenTrabajo, ItemsAsociadosOrdenTrabajo,
                                                        OperacionesAsociadasOrdenTrabajo, KitsAsociadosOrdenTrabajo,
                                                        instanciaOrdenTrabajoGarantia, instanciaOrdenTrabajoSeguros,
                                                        Convert.ToInt32(ddlDocumentoTransferencia.SelectedValue),
                                                        IdNumeroDocumentoTransferencia, Convert.ToByte(ddlCargoOrden.SelectedValue),
                                                        Convert.ToByte(ddlListaPrecioItems.SelectedValue));
            Response.Redirect("CrearOT.aspx?s=true");
        }
        catch (Exception ex)
        {
            lblMessage.Text = ex.ToString();
        }
    }

    #endregion

    #region Metodos

    private void AsociarGrillaAccesorios()
    {
        grdAccesorios.DataSource = this.AccesoriosOrdenTrabajo;
        grdAccesorios.DataBind();
    }

    private void AsociarGrillaItems()
    {
        grdItems.DataSource = this.ItemsAsociadosOrdenTrabajo;
        grdItems.DataBind();
    }

    private void AsociarGrillaKits()
    {
        grdKits.DataSource = this.KitsAsociadosOrdenTrabajo;
        grdKits.DataBind();
    }

    private void AsociarGrillaOperaciones()
    {
        grdOperaciones.DataSource = this.OperacionesAsociadasOrdenTrabajo;
        grdOperaciones.DataBind();
    }

    private void AsociarConsolidadOrdenTrabajo()
    {
        txtTotalParcial.Text = ValorTotalOrdenTrabajo.ToString("c");
    }

    private void AsociarEstimadoEntregaOrdenTrabajo()
    {
        txtFechaEstimadaEntrega.Text = this.ValorEstimadoEntrega.ToString("yyyy-MM-dd", new CultureInfo("es-ES"));
        txtHoraEstimadaEntrega.Text = this.ValorEstimadoEntrega.ToString("HH:mm:ss", new CultureInfo("es-ES"));
    }

    #endregion    
}
